home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Windows Game Programming for Dummies (2nd Edition)
/
WinGamProgFD.iso
/
mac
/
DirectX SDK
/
DXSDK
/
samples
/
Multimedia
/
Misc
/
DXinstall
/
winmain.cpp
< prev
Wrap
C/C++ Source or Header
|
2001-10-31
|
12KB
|
348 lines
//-----------------------------------------------------------------------------
// File: WinCode.cpp
//
// Desc: All of the Windows specific code needed for the DSetup sample
//
// The code in this file includes the main Windows entry point
// as well as code to handle messages and our modeless version of
// MessageBox().
//
// Call Tree:
// WinMain Main Windows Entry Point
// DirectXInstallInit Initializes & registers window class
// DirectXInstallWndProc Processes windows messages
// DirectXInstall See DINSTALL.CPP
// DirectXGetVersion See DINSTALL.CPP
// DirectXInstall See DINSTALL.CPP
// DlgProc Handles all messages for our modeless MessageBox()
// SetButtons Initializes the text of the dialog buttons to mimmic MessageBox()
// ShowButton Helper function to get and set the text of a button from resource strings
//
// Copyright (c) 1998-2001 Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#include <windows.h>
#include <basetsd.h>
#include <stdio.h>
#include <string.h>
#include <dsetup.h>
#include "resource.h"
#include "DXInstall.h"
//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
DWORD g_dwStatus = SHOW_ALL; // Filter setting for messages from DirectXSetup
HINSTANCE g_hInstance; // Global instance handle
HWND g_hDlg = NULL; // Window handle to dialog proc
CHAR g_strAppTitle[256]; // Application title
INT g_iReply = -1; // Global value for dialog return
BOOL g_bCheckOlder = FALSE; // Whether or not to check for older installs
//-----------------------------------------------------------------------------
// Name: ShowButton()
// Desc: Helper function to get and set the text of a button from the
// resource strings.
//-----------------------------------------------------------------------------
VOID ShowButton( HWND hDlg, int Id, int strid )
{
HWND btnHwd = GetDlgItem( hDlg, Id );
CHAR buf[20];
LoadString( g_hInstance, strid, buf, 20 );
SetWindowText( btnHwd, buf );
ShowWindow( btnHwd, SW_NORMAL );
}
//-----------------------------------------------------------------------------
// Name: SetButtons()
// Desc: Initializes the text of the dialog buttons to mimmic MessageBox()
//-----------------------------------------------------------------------------
VOID SetButtons( HWND hDlg, DWORD wMsgType )
{
LONG dwStyle;
switch( wMsgType & 0x0000000F )
{
case MB_OKCANCEL:
ShowButton( hDlg, IDBUT1, STR_OK );
ShowButton( hDlg, IDBUT2, STR_CANCEL );
ShowWindow( GetDlgItem( hDlg, IDBUT3 ), SW_HIDE );
break;
case MB_OK:
ShowButton( hDlg, IDBUT3, STR_OK );
break;
case MB_RETRYCANCEL:
ShowButton( hDlg, IDBUT1, STR_RETRY );
ShowButton( hDlg, IDBUT2, STR_CANCEL );
ShowWindow( GetDlgItem( hDlg, IDBUT3 ), SW_HIDE );
break;
case MB_ABORTRETRYIGNORE:
ShowButton( hDlg, IDBUT1, STR_ABORT );
ShowButton( hDlg, IDBUT3, STR_RETRY );
ShowButton( hDlg, IDBUT2, STR_IGNORE );
break;
case MB_YESNOCANCEL:
ShowButton( hDlg, IDBUT1, STR_YES );
ShowButton( hDlg, IDBUT3, STR_NO );
ShowButton( hDlg, IDBUT2, STR_CANCEL );
break;
case MB_YESNO:
ShowButton( hDlg, IDBUT1, STR_YES );
ShowButton( hDlg, IDBUT2, STR_NO );
ShowWindow( GetDlgItem( hDlg, IDBUT3 ), SW_HIDE );
break;
default:
ShowWindow( GetDlgItem( hDlg, IDBUT1 ), SW_HIDE );
ShowWindow( GetDlgItem( hDlg, IDBUT2 ), SW_HIDE );
ShowWindow( GetDlgItem( hDlg, IDBUT3 ), SW_HIDE );
break;
}
if( !(wMsgType & MB_DEFBUTTON2) )
{
dwStyle = GetWindowLong( GetDlgItem( hDlg, IDBUT2 ), GWL_STYLE );
SendMessage( GetDlgItem( hDlg, IDBUT2 ), BM_SETSTYLE, dwStyle & ~BS_DEFPUSHBUTTON, 0 );
}
else
{
dwStyle = GetWindowLong(GetDlgItem( hDlg, IDBUT2 ), GWL_STYLE);
SendMessage( GetDlgItem( hDlg, IDBUT2 ), BM_SETSTYLE, dwStyle | BS_DEFPUSHBUTTON, 0 );
}
if (!(wMsgType & MB_DEFBUTTON3))
{
dwStyle = GetWindowLong( GetDlgItem( hDlg, IDBUT3 ), GWL_STYLE);
SendMessage( GetDlgItem( hDlg, IDBUT3 ), BM_SETSTYLE, dwStyle & ~BS_DEFPUSHBUTTON, 0 );
}
else
{
dwStyle = GetWindowLong( GetDlgItem( hDlg, IDBUT3 ), GWL_STYLE);
SendMessage( GetDlgItem( hDlg, IDBUT3 ), BM_SETSTYLE, dwStyle | BS_DEFPUSHBUTTON, 0 );
}
if (!(wMsgType & MB_DEFBUTTON3) && !(wMsgType & MB_DEFBUTTON2))
{
dwStyle = GetWindowLong( GetDlgItem( hDlg, IDBUT1 ), GWL_STYLE);
SendMessage( GetDlgItem( hDlg, IDBUT1 ), BM_SETSTYLE, dwStyle | BS_DEFPUSHBUTTON, 0 );
}
else
{
dwStyle = GetWindowLong( GetDlgItem( hDlg, IDBUT1 ), GWL_STYLE );
SendMessage( GetDlgItem( hDlg, IDBUT1 ), BM_SETSTYLE, dwStyle & ~BS_DEFPUSHBUTTON, 0 );
}
}
//-----------------------------------------------------------------------------
// Name: DlgProc()
// Desc: Message proc for our modeless version of MessageBox()
// This function sets g_wReply for GetReply()
//-----------------------------------------------------------------------------
DLGPROC DlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_INITDIALOG:
SetButtons( hDlg, -1 );
break;
case WM_COMMAND:
switch( LOWORD(wParam) )
{
case IDBUT1:
case IDBUT2:
case IDBUT3:
// Let GetReply() know the user clicked on a button
g_iReply = LOWORD(wParam);
break;
}
break;
case WM_ACTIVATE:
if( LOWORD(wParam) == WA_INACTIVE )
{
if( (HWND)lParam == GetParent( hDlg ) )
{
SetForegroundWindow( hDlg );
}
}
break;
}
return 0;
}
//-----------------------------------------------------------------------------
// Name: SetStatusChecks()
// Desc: Helper function to set checkmarks by status menu items
//-----------------------------------------------------------------------------
VOID SetStatusChecks( HWND hWnd )
{
CheckMenuItem( GetMenu( hWnd ), IDSHOWALL, MF_BYCOMMAND|MF_UNCHECKED );
CheckMenuItem( GetMenu( hWnd ), IDSHOWUPGRADES, MF_BYCOMMAND|MF_UNCHECKED );
CheckMenuItem( GetMenu( hWnd ), IDSHOWPROBLEMS, MF_BYCOMMAND|MF_UNCHECKED );
CheckMenuItem( GetMenu( hWnd ), IDSHOWNOTHING, MF_BYCOMMAND|MF_UNCHECKED );
switch( g_dwStatus )
{
case SHOW_ALL:
CheckMenuItem( GetMenu( hWnd ), IDSHOWALL, MF_BYCOMMAND|MF_CHECKED );
break;
case SHOW_UPGRADES:
CheckMenuItem( GetMenu( hWnd ), IDSHOWUPGRADES, MF_BYCOMMAND|MF_CHECKED );
break;
case SHOW_PROBLEMS:
CheckMenuItem( GetMenu( hWnd ), IDSHOWPROBLEMS, MF_BYCOMMAND|MF_CHECKED );
break;
case SHOW_NONE:
CheckMenuItem( GetMenu( hWnd ), IDSHOWNOTHING, MF_BYCOMMAND|MF_CHECKED );
break;
}
}
//-----------------------------------------------------------------------------
// Name: DirectXInstallWndProc()
// Desc: Processes windows messages
//-----------------------------------------------------------------------------
INT_PTR CALLBACK DirectXInstallWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_COMMAND:
// Process menu items
switch( LOWORD(wParam) )
{
case IDINSTALL:
DirectXInstall( hWnd );
break;
case IDGETVERSION:
DirectXGetVersion();
break;
case IDEXIT:
DestroyWindow( hWnd );
break;
case IDSHOWALL:
g_dwStatus = SHOW_ALL;
SetStatusChecks( hWnd );
break;
case IDSHOWUPGRADES:
g_dwStatus = SHOW_UPGRADES;
SetStatusChecks( hWnd );
break;
case IDSHOWPROBLEMS:
g_dwStatus = SHOW_PROBLEMS;
SetStatusChecks( hWnd );
break;
case IDSHOWNOTHING:
g_dwStatus = SHOW_NONE;
SetStatusChecks( hWnd );
break;
case IDCHECKOLDERINSTALL:
g_bCheckOlder = !g_bCheckOlder;
CheckMenuItem( GetMenu(hWnd), IDCHECKOLDERINSTALL,
MF_BYCOMMAND|MF_CHECKED );
break;
}
return 0;
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
//-----------------------------------------------------------------------------
// Name: DirectXInstallInit()
// Desc: Initializes window data and registers window class
// Sets up a structure to register the window class. Structure includes
// such information as what function will process messages, what cursor
// and icon to use, etc.
//-----------------------------------------------------------------------------
BOOL DirectXInstallInit( HINSTANCE hInstance )
{
WNDCLASS wndClass; // structure pointer
ZeroMemory( &wndClass, sizeof(WNDCLASS) );
wndClass.style = CS_GLOBALCLASS;
wndClass.lpfnWndProc = (WNDPROC) DirectXInstallWndProc;
wndClass.hInstance = hInstance;
wndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN_ICON));
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName = "MainMenu";
wndClass.lpszClassName = (LPSTR) "DirectXInstall";
// Returns result of registering the window
return RegisterClass( &wndClass );
}
//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: Calls initialization function, processes message loop
// This will initialize the window class if it is the first time this
// application is run. It then creates the window, and processes the
// message loop until a PostQuitMessage is received. It exits the
// application by returning the value passed by the PostQuitMessage.
//-----------------------------------------------------------------------------
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR strCmdLine, int nCmdShow )
{
// Has application been initialized?
if( NULL == hPrevInstance )
if( 0 == DirectXInstallInit( hInstance ) )
return 0;
g_hInstance = hInstance;
HWND hWnd = CreateWindow( "DirectXInstall", "DirectX Install",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, g_hInstance, NULL );
if( NULL == hWnd )
return 0;
LoadString( g_hInstance, STR_TITLE, g_strAppTitle, 200 );
ShowWindow( hWnd, SW_NORMAL );
UpdateWindow( hWnd ); // Send a WM_PAINT message
SetStatusChecks( hWnd ); // Check the default message menu item
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
// Returns the value from PostQuitMessage
return (int)msg.wParam;
}